/*
** $ 身份：嘞只入出.h $
** 缓冲流
** 请参见炉啊.h中的版权声明
*/

#ifndef 嘞只入出_喝
#define 嘞只入出_喝

#include "炉啊.h"

#include "嘞内存.h"

#define 只终 (-1)			/* 流结束 */
typedef struct 只入出 只入出;
#define 只取西(只)  (((只)->恩--)>0 ?  投_由印刻(*(只)->匹++) : 炉啊只_填(只))

typedef struct 摸缓冲 {
  char *缓冲;
  size_t 恩;
  size_t 缓冲冲大小;
} 摸缓冲;

#define 炉啊只_初始缓冲(嘞, 缓冲冲) ((缓冲冲)->缓冲 = NULL, (缓冲冲)->缓冲冲大小 = 0)

#define 炉啊只_缓冲(缓冲冲)	((缓冲冲)->缓冲)
#define 炉啊只_大小缓冲(缓冲冲)	((缓冲冲)->缓冲冲大小)
#define 炉啊只_缓冲冲长度(缓冲冲)	((缓冲冲)->恩)

#define 炉啊只_缓冲冲移除(缓冲冲,艾)	((缓冲冲)->恩 -= (艾))
#define 炉啊只_重置缓冲(缓冲冲) ((缓冲冲)->恩 = 0)

#define 炉啊只_重新大小缓冲(嘞, 缓冲冲, 大小) \
	((缓冲冲)->缓冲 = 炉啊摸_重新分配微印刻(嘞, (缓冲冲)->缓冲, \
				(缓冲冲)->缓冲冲大小, 大小), \
	(缓冲冲)->缓冲冲大小 = 大小)

#define 炉啊只_自由缓冲(嘞, 缓冲冲)	炉啊只_重新大小缓冲(嘞, 缓冲冲, 0)

炉啊艾_函 void 炉啊只_初始 (炉啊_国 *嘞, 只入出 *只, 炉啊_读者 读者,
                                        void *数据);

炉啊艾_函 size_t 炉啊只_读 (只入出* 只, void *哔, size_t 恩);	/* 读下一个n字节 */

/* --------- 私有部分 ------------------ */
struct 只入出 {
  size_t 恩;			/* 字节仍未读取 */
  const char *匹;		/* 缓冲区中的当前位置 */
  炉啊_读者 读者;		/* 读者函数 */
  void *数据;			/* 附加数据 */
  炉啊_国 *嘞;			/* 炉啊国 (为读者) */
};

炉啊艾_函 int 炉啊只_填 (只入出 *只);

#endif